package com.itany.corejava.code02_运算符;

/**
 * @author 石小俊
 * @date 2023年04月10日 14:05
 */
public class Test08_位运算符 {
    public static void main(String[] args) {
        int num1 = 5;
        int num2 = 8;
        // num1二进制:00000000 00000000 00000000 00000101
        // num2二进制:00000000 00000000 00000000 00001000
        // 00000000 00000000 00000000 00000000
        // 其值即为:0
        System.out.println(num1 & num2);

        // num1二进制:00000000 00000000 00000000 00000101
        // num2二进制:00000000 00000000 00000000 00001000
        // 00000000 00000000 00000000 00001101
        // 其值即为:1+4+8=13
        System.out.println(num1 | num2);

        // num1二进制:00000000 00000000 00000000 00000101
        // 11111111 11111111 11111111 11111010  补码
        // 反码:11111111 11111111 11111111 11111001
        // 原码:10000000 00000000 00000000 00000110
        // 其值即为:-6
        System.out.println(~num1);

        // num1二进制:00000000 00000000 00000000 00000101
        // num2二进制:00000000 00000000 00000000 00001000
        // 00000000 00000000 00000000 00001101
        // 其值即为:1+4+8=13
        System.out.println(num1 ^ num2);

        // num1二进制:00000000 00000000 00000000 00000101
        // 00 00000000 00000000 00000000 00010100
        // 其值即为: 4+16 = 20
        System.out.println(num1 << 2);

        // num1二进制:00000000 00000000 00000000 00000101
        // 00000000 00000000 00000000 00000001 01
        // 其值即为1
        System.out.println(num1 >> 2);

        // -8的二进制:10000000 00000000 00000000 00001000
        // 在计算机中所有的运算针对的是二进制补码
        // 反码:11111111 11111111 11111111 11110111
        // 补码:11111111 11111111 11111111 11111000
        // 右移2位:11111111 11111111 11111111 11111110 00
        // 右移后得到的补码:11111111 11111111 11111111 11111110
        // 对应的反码:11111111 11111111 11111111 11111101
        // 原码:10000000 00000000 00000000 00000010
        // 其值为-2
        System.out.println(-8 >> 2);

        // -8的二进制:10000000 00000000 00000000 00001000
        // 在计算机中所有的运算针对的是二进制补码
        // 反码:11111111 11111111 11111111 11110111
        // 补码:11111111 11111111 11111111 11111000
        // 无符号右移2位:00111111 11111111 11111111 11111110 00
        // 右移后补码为:00111111 11111111 11111111 11111110
        // 正数的原码与补码一致
        // 其值为: 1073741822
        System.out.println(-8 >>> 2);
    }
}
